package com.ys.io.p5拷贝文件IO综合案列;

import java.io.*;

/**
 * 描述: 拷贝多层次的文件夹和子文件
 *
 * @author CodeYang
 * @version 2020/12/31 16:48
 */
public class 拷贝多层次的文件夹和子文件 {

    public static void main(String[] args) {
        // 创建原路径 File对象
        File srcPath = new File("C:\\Users\\CodeYang\\Desktop\\编辑器+集成开发环境");
        //创建目的路径 File对象
        File dstPath = new File("day_24");

        try {
            copyFolder(srcPath, dstPath);
            System.out.println("拷贝成功");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 拷贝文件夹及子文件内容:
     * 使用递归
     *
     * @param srcPath
     * @param dstPath
     */
    private static void copyFolder(File srcPath, File dstPath) throws Exception {
        // 1 判断原file 是不是一个目录:
        if (srcPath.isDirectory()) {
            // 是: 继续处理 准备递归
            //2 获取原路径名称,给目的路径使用 原路径成为 目的路径,只有否 才是最外面进行文件的拷贝
            String srcPathName = srcPath.getName();
            // 3 创建新的目的路径
            File newDestPath = new File(dstPath, srcPathName);
            // 4: 判断 newDestPath 是否存在,不存在就创建
            if (!newDestPath.exists()) {
                newDestPath.mkdir();

                //5 : 获取原路径下的所有文件对象 目录+文件
                File[] allFilesList = srcPath.listFiles();
                for (File newSrcFile : allFilesList) {
                    // 外层if为true表示srcPath是一个目录，进行递归调用
                    System.out.println("原路径：" + newSrcFile.getCanonicalPath() + "--目的路径：" + newDestPath.getCanonicalPath());
                    //递归调用
                    copyFolder(newSrcFile, newDestPath);
                }
            }
        } else {
            //最外层
            // 是"最底层" file 直接拷贝
            // 目的文件路径: 当前模块的文件+层次文件夹+原路径的文件名称(层次,递归)
            File newDestPath = new File(dstPath, srcPath.getName());

            copyFile(srcPath, newDestPath);
        }
    }

    /**
     * 使用直接流拷贝文件
     *
     * @param srcPath      原路径
     * @param newDestPath 目的路径
     */
    private static void copyFile(File srcPath, File newDestPath) throws Exception {
        //使用字节缓冲流

        try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcPath));
             BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(newDestPath));
        ) {
            byte[] data = new byte[1024];
            int len = 0;
            while ((len = bis.read(data)) != -1) {
                bos.write(data, 0, len);
            }
            bos.flush();

        }

    }
}
